package logica;

import java.util.ArrayList;
import java.util.List;
import java.io.Serializable;

public class Elemento implements Serializable {

	private static final long serialVersionUID = 7904150697889397865L;

	private String m_nombre;
	private List<String> m_atributos;
	private String m_imagen;

	/** Construye el elemento vacio. **/
	public Elemento() {
		m_atributos = new ArrayList<String>();
	}

	/** Construye el elemento por el nombre. **/
	public Elemento(String nombre) {
		m_nombre = nombre;
		m_atributos = new ArrayList<String>();
	}

	/** Construye el elemento por el nombre y los atributos. **/
	public Elemento(String nombre, List<String> atributos) {
		m_nombre = nombre;
		setAtributos(atributos);
	}

	public void setNombre(String nombre) {
		if (m_nombre == null)
			m_nombre = nombre;
	}

	public void setImagen(String clave) {
		m_imagen = clave;
	}

	public void setAtributos(List<String> atributos) {
		m_atributos = new ArrayList<String>();
		for (int i = 0; i < atributos.size(); i++)
			addAtributo(atributos.get(i));
	}

	/** Agrega un nuevo atributo al final de la lista. **/
	public void addAtributo(String nuevo) {
		if (nuevo != null && !nuevo.isEmpty() && !(nuevo == ""))
			m_atributos.add(nuevo);
	}

	public String getNombre() {
		return m_nombre;
	}

	public String getImagen() {
		return m_imagen;
	}

	public String getAtributo() {
		return (!m_atributos.isEmpty()) ? m_atributos.get(0) : null;
	}

	/** Elimina un atributo por su nombre. **/
	public boolean removerAtributo(String remover) {
		return m_atributos.remove(remover);
	}

	public boolean contieneAtributo(String atributo) {
		return m_atributos.contains(atributo);
	}

	/** Genera un elemento nuevo a partir de un atributo diferente al del otro. **/
	public Elemento atributoDiferente(Elemento otro) {
		if (isEmpty())
			return null;

		Elemento nuevo = new Elemento();
		for (int i = 0; i < m_atributos.size(); i++)
			if (!otro.m_atributos.contains(m_atributos.get(i))) {

				String atributo = m_atributos.remove(i);
				nuevo.addAtributo(atributo);
				return nuevo;
			}
		return null;
	}

	public boolean soloAtributos() {
		return ((m_nombre == null || m_nombre.isEmpty()) && !m_atributos
				.isEmpty());
	}

	/** Esta vacio si no tiene nombre y no tiene atributos. **/
	public boolean isEmpty() {
		return ((m_nombre == null || m_nombre.isEmpty()) && m_atributos
				.isEmpty());
	}

	@Override
	public boolean equals(Object obj) {

		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Elemento other = (Elemento) obj;
		if (m_nombre == null) {
			if (other.m_nombre != null)
				return false;
		} else if (!m_nombre.equals(other.m_nombre))
			return false;
		return true;
	}

	public String toString() {
		if (isEmpty())
			return "elemento vacio";

		if (soloAtributos())
			return "[" + getAtributo() + "]";
		else
			return "[" + getNombre() + "]";

	}
}
